package io.file;

import framework.AbstractTest;
import utils.IOUtils;
import utils.Log;
import utils.StringUtils;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

/**
 * Created by shane on 2018/5/21.
 *
 * 内存映射文件
 *
 * 内存映射文件允许我们创建和修改那些因为太大而不能放入内存的文件。
 * 有了内存映射文件，我们就可以假定整个文件都放在内存中, 而且完全可以把它当做非常大的数组来访问。
 * 这种方法极大地简化了用于修改文件的代码。
 */
public class LargeMappedFiles extends AbstractTest {
    protected static final String TAG = LargeMappedFiles.class.getName();
    static final int LENGTH = 0X8FFFFFF; // 128MB

    @Override
    public void test(String[] args) {
        super.test(args);
        String tempFilePath = getDefTempFile(args);

        try {
            MappedByteBuffer out = new RandomAccessFile(tempFilePath, FILE_MODE_RW).getChannel().map(
                    FileChannel.MapMode.READ_WRITE, 0, LENGTH
            );

            for (int i = 0; i < LENGTH; i++) {
                out.put((byte)'x');
            }
            Log.vn("finished writing...");


        } catch (Exception e) {

        }

    }

    @Override
    protected String getTag() {
        return TAG;
    }

    public static byte[] read(File file) {
        try {
            BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
            byte[] data = new byte[in.available()];
            in.read(data);
            IOUtils.close(in);
            return data;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }

    public static byte[] read(String filename) {
        if (StringUtils.isEmpty(filename)) {
            return null;
        }
        return read(new File(filename));
    }
}
